package com.liu.common.entity.vo;

import cn.hutool.core.annotation.Alias;
import com.liu.common.entity.BaseEntity;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.util.List;

@Getter
@Setter
public class DeepSeekChatCompletionsVO extends BaseEntity {

    /**
     * 该对话的唯一标识符
     */
    private String id;

    /**
     * 模型生成的 completion 的选择列表
     */
    private List<Choice> choices;

    /**
     * 创建聊天完成时的 Unix 时间戳（以秒为单位）
     */
    private Integer created;

    /**
     * 生成该 completion 的模型名
     */
    private String model;

    /**
     * This fingerprint represents the backend configuration that the model runs with
     */
    @Alias("system_fingerprint")
    private String systemFingerprint;

    /**
     * 对象的类型, 其值为 chat.completion
     */
    private String object;

    /**
     * 该对话补全请求的用量信息
     */
    private Usage usage;

    @Getter
    @Setter
    public static class Choice extends BaseEntity {

        /**
         * 模型停止生成 token 的原因。
         * stop：模型自然停止生成，或遇到 stop 序列中列出的字符串。
         * length ：输出长度达到了模型上下文长度限制，或达到了 max_tokens 的限制。
         * content_filter：输出内容因触发过滤策略而被过滤。
         * insufficient_system_resource：系统推理资源不足，生成被打断。
         */
        @Alias("finish_reason")
        private String finishReason;

        /**
         * 该 completion 在模型生成的 completion 的选择列表中的索引
         */
        private Integer index;

        /**
         * 模型生成的 completion 消息
         */
        private Message message;

        /**
         * 该 choice 的对数概率信息
         */
        private Logprobs logprobs;

        @Getter
        @Setter
        public static class Message extends BaseEntity {

            /**
             * 该 completion 的内容
             */
            private String content;

            /**
             * 仅适用于 deepseek-reasoner 模型。内容为 assistant 消息中在最终答案之前的推理内容
             */
            @Alias("reasoning_content")
            private String reasoningContent;

            /**
             * 模型生成的 tool 调用，例如 function 调用
             */
            @Alias("tool_calls")
            private List<ToolCall> toolCalls;

            /**
             * 生成这条消息的角色
             */
            private String role;

            @Getter
            @Setter
            public static class ToolCall extends BaseEntity {

                /**
                 * tool 调用的 ID
                 */
                private String id;

                /**
                 * tool 的类型。目前仅支持 function。
                 */
                private String type;

                /**
                 * 模型调用的 function
                 */
                private Function function;

                @Getter
                @Setter
                public static class Function extends BaseEntity {

                    /**
                     * 模型调用的 function 名
                     */
                    private String name;

                    /**
                     * 要调用的 function 的参数，由模型生成，格式为 JSON
                     */
                    private String arguments;
                }
            }
        }

        @Getter
        @Setter
        public static class Logprobs extends BaseEntity {

            /**
             * 一个包含输出 token 对数概率信息的列表
             */
            private List<Content> content;

            @Getter
            @Setter
            public static class Content extends BaseEntity {

                /**
                 * 输出的 token
                 */
                private String token;

                /**
                 * 该 token 的对数概率。-9999.0 代表该 token 的输出概率极小，不在 top 20 最可能输出的 token 中。
                 */
                private BigDecimal logprob;

                /**
                 * 一个包含该 token UTF-8 字节表示的整数列表。一般在一个 UTF-8 字符被拆分成多个 token 来表示时有用。如果 token 没有对应的字节表示，则该值为 null。
                 */
                private Integer[] bytes;

                /**
                 * 一个包含在该输出位置上，输出概率 top N 的 token 的列表，以及它们的对数概率。在罕见情况下，返回的 token 数量可能少于请求参数中指定的 top_logprobs 值。
                 */
                @Alias("top_logprobs")
                private List<TopLogprobs> topLogprobs;

                @Getter
                @Setter
                public static class TopLogprobs extends BaseEntity {

                    /**
                     * 输出的 token
                     */
                    private String token;

                    /**
                     * 该 token 的对数概率。-9999.0 代表该 token 的输出概率极小，不在 top 20 最可能输出的 token 中。
                     */
                    private BigDecimal logprob;

                    /**
                     * 一个包含该 token UTF-8 字节表示的整数列表。一般在一个 UTF-8 字符被拆分成多个 token 来表示时有用。如果 token 没有对应的字节表示，则该值为 null。
                     */
                    private Integer[] bytes;
                }
            }
        }
    }

    @Getter
    @Setter
    public static class Usage extends BaseEntity {

        /**
         * 模型 completion 产生的 token 数
         */
        @Alias("completion_tokens")
        private Integer completionTokens;

        /**
         * 用户 prompt 所包含的 token 数。该值等于 prompt_cache_hit_tokens + prompt_cache_miss_tokens
         */
        @Alias("prompt_tokens")
        private Integer promptTokens;

        /**
         * 用户 prompt 中，命中上下文缓存的 token 数
         */
        @Alias("prompt_cache_hit_tokens")
        private Integer promptCacheHitTokens;

        /**
         * 用户 prompt 中，未命中上下文缓存的 token 数
         */
        @Alias("prompt_cache_miss_tokens")
        private Integer promptCacheMissTokens;

        /**
         * 该请求中，所有 token 的数量（prompt + completion）
         */
        @Alias("total_tokens")
        private Integer totalTokens;

        /**
         * completion tokens 的详细信息
         */
        @Alias("completion_tokens_details")
        private CompletionTokensDetail completionTokensDetails;

        @Getter
        @Setter
        public static class CompletionTokensDetail extends BaseEntity {

            /**
             * 推理模型所产生的思维链 token 数量
             */
            @Alias("reasoning_tokens")
            private Integer reasoningTokens;
        }
    }
}
